class OuterClass{

    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
    //非静态内部类
   class InnerClass{
        public int data1 = 11111;
        public int data4 = 4;
        private int data5 = 5;
        //常量是在程序编译的时候就能确定，如果不加final就是一个变量，变量只有在运行时去取数值的时候才能知道值
        public static final int data6 = 6;
//静态成员不依赖于对象。所以一个非静态类不能定义一个静态成员。如果执意要实现，可在静态对象中加上final
//当外部类加载的时候，这个非静态内部类不会加载。加上final后，不加载也知道data6是几
        public void func(){
            System.out.println("static -> InnerClass::func()");
            System.out.println(data1);//就近原则,data1为”11111“.如果想输出外部类的data1怎么办？
            System.out.println("========"+OuterClass.this.data1);//输出外部类的data1
            //在非静态内部类当中，包含两个this：一个是内部类this；一个是外部类this
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);

        }
    }
    public void test(){
        InnerClass innerClass = new InnerClass();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(innerClass.data4);
        System.out.println(innerClass.data5);
        System.out.println(InnerClass.data6);//这个静态类是通过类名访问的
    }
}

//**************************局部内部类*****************
class Outerclass2{

    public void func(){
        class InnerClass{
            public int a = 1;
            public void test(){
                System.out.println("hello!");
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.test();
    }
}
interface IA{
    void func();
}
class AA implements IA{
    @Override
    public void func() {
        System.out.println("hello!!!");
    }
}
public class Test {
    public static void main(String[] args) {
        new IA(){
            @Override
            public void func() {
                System.out.println("aaaaaaaa");
            }
        }.func();

    }
    public static void main3(String[] args) {
        IA ia = new AA();
        ia.func();
    }
    public static void main2(String[] args) {//局部内部类
        Outerclass2 outerClass2 = new Outerclass2();
        outerClass2.func();
    }
    public static void main1(String[] args) {
        //如何实例化非静态内部类？
        //非静态内部类依赖于外部对象，所以要借助外部类对象。然后通过外部类对象调用内部类
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.func();
    }
}

